Programming¶
import pandas as pd
import numpy as np
import os
import plotly.express as px
import plotly.graph_objects as go
import matplotlib.pyplot as plt
# display all columns
pd.set_option('display.max_columns', None)
# ignore warnings
pd.options.mode.chained_assignment = None
import plotly.io as pio
pio.renderers.default='notebook' # make plots visible in html
# define the template for the plots
template = 'simple_white'
Import Dataframes¶
The data is downloaded from www.unhcr.org. UNHCR, also known as the UN Refugee Agency, is a global organisation with the noble mission of saving lives, protecting rights, and fostering better futures for people forced to flee their homes. They collect data on immigration and refuge worldwide.
This data concerns the number of applications for asylum in countries around the world.
In order to obtain the latitude and longitude of the countries, a function was created to map them to the data. Please note that an internet connection is required to retrieve the geographical positions. In the Jupyter Notebook, SaveLatLonToCSV.ipynb, the geo information about those countries is fetched and stored in a .csv file (iso_lat_long.csv), which is then imported.
Columns:
Year: The Year
Country of origin: Country of origin
Country of asylum: Country in which they ask for asylum
Country of origin (ISO): Country of origin ISO Code
Country of asylum (ISO): Countries ISO Code in which they ask for asylum
Applied: The amount of asylum applications
Authority, Application type, Stage of Procedure, and Cases / Persons: Additional information
cwd = os.getcwd()
path_asyl = os.path.join(cwd, 'data', 'query_data-2', 'asylum-applications.csv')
IDA¶
df_asyl = pd.read_csv(path_asyl)
display(df_asyl.head(3))
print(df_asyl.shape)
print(df_asyl.info())
| Year | Country of origin | Country of origin (ISO) | Country of asylum | Country of asylum (ISO) | Authority | Application type | Stage of procedure | Cases / Persons | applied | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2015 | Afghanistan | AFG | Australia | AUS | G | A | AR | C | 22 |
| 1 | 2015 | Albania | ALB | Australia | AUS | G | A | AR | C | 7 |
| 2 | 2015 | Algeria | DZA | Australia | AUS | G | A | AR | C | 5 |
(49024, 10) <class 'pandas.core.frame.DataFrame'> RangeIndex: 49024 entries, 0 to 49023 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Year 49024 non-null int64 1 Country of origin 49024 non-null object 2 Country of origin (ISO) 49024 non-null object 3 Country of asylum 49024 non-null object 4 Country of asylum (ISO) 49024 non-null object 5 Authority 49024 non-null object 6 Application type 49024 non-null object 7 Stage of procedure 48305 non-null object 8 Cases / Persons 49024 non-null object 9 applied 49024 non-null int64 dtypes: int64(2), object(8) memory usage: 3.7+ MB None
df_asyl_grp = df_asyl.groupby(by=['Year','Country of origin (ISO)', 'Country of asylum (ISO)',
'Country of asylum', 'Country of origin']).sum(numeric_only=True).reset_index().sort_values(by='Year', ascending=False)
# Rename Venezuela (Bolivarian Republic of) to Venezuela, RB
df_asyl_grp.loc[df_asyl_grp['Country of origin'].str.contains('Venezuela'), 'Country of origin'] = 'Venezuela, RB'
Where are the most refugees come from each year?¶
df_most_asyl = df_asyl_grp.groupby(by=['Year', 'Country of origin'])['applied'].sum().to_frame().reset_index()
df_most_asyl.head(10)
| Year | Country of origin | applied | |
|---|---|---|---|
| 0 | 2015 | Afghanistan | 280343 |
| 1 | 2015 | Albania | 73986 |
| 2 | 2015 | Algeria | 10487 |
| 3 | 2015 | Andorra | 5 |
| 4 | 2015 | Angola | 2835 |
| 5 | 2015 | Antigua and Barbuda | 19 |
| 6 | 2015 | Argentina | 97 |
| 7 | 2015 | Armenia | 7073 |
| 8 | 2015 | Australia | 5 |
| 9 | 2015 | Azerbaijan | 3780 |
# define the highlight countries
highlight_list = ['Venezuela, RB', 'Afghanistan', 'Syrian Arab Rep.','Iraq', 'Ukraine']
dataframes = {}
for element in highlight_list:
dataframes[element] = df_most_asyl[df_most_asyl['Country of origin'] == element]
# define function for line plot
import seaborn as sns
def line_plot(df_most_asyl, dataframes, title=''):
fig = px.line(df_most_asyl, x='Year', y='applied',
line_group='Country of origin', labels={'applied':'Number of Asylum Applications', 'year':'Year'},
title=title, template=template)
fig.update_layout(showlegend=True,
plot_bgcolor='white',
title_x=0.5,
xaxis=dict(
showline=True,
showgrid=False,
showticklabels=True,
linecolor='rgb(204, 204, 204)',
linewidth=2,
ticks='outside',
tickfont=dict(
family='Arial',
size=12,
color='rgb(82, 82, 82)',
),
),
yaxis=dict(
showgrid=True,
zeroline=False,
showline=True,
showticklabels=True,
linecolor='rgb(204, 204, 204)',
linewidth=2,
ticks='outside',
tickfont=dict(
family='Arial',
size=12,
color='rgb(82, 82, 82)',),)
)
fig.update_traces(line=dict(color='grey', width=0.7), selector=dict(mode='lines'), opacity=0.5)
# define the colors for the highlight countries
colors = sns.color_palette('Blues_r', n_colors=len(highlight_list))
rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
line_style_list = ['solid', 'dash', 'dot', 'dashdot', 'longdash']
for i, col in enumerate(highlight_list):
fig.add_trace(go.Scatter(
x=dataframes[col].Year,
y=dataframes[col].applied,
mode='lines+markers+text',
name=col,
line=dict(color=rgb_colors[i], width=3, dash=line_style_list[i]) # Setzen Sie die Farbe und die Linienbreite auf die gewünschten Werte
))
# Add annotation Venezuela
fig.add_annotation(x=2019, y=440805,
text="Peak of the Venezuela Refugee Crisis",
showarrow=True,
yshift=10)
# Add annotation Venezuela Crisis
fig.add_annotation(x=2016, y=500000,
text="Start of Venezuela Refugee Crisis",
showarrow=True,
yshift=-20,
xshift=0)
# Add annotation Covid-19
fig.add_annotation(x=2020, y=440805,
text="Start of Covid-19 Pandemic",
showarrow=True,
yshift=-20,
xshift=0)
# Add vertical line Venezuela Crisis
fig.add_shape(
dict(
type="line",
x0=2016,
y0=0,
x1=2016,
y1=450000,
line=dict(
color="Black",
width=2
)
)
)
# Add vertical line Covid-19
fig.add_shape(
dict(
type="line",
x0=2020,
y0=0,
x1=2020,
y1=390000,
line=dict(
color="Black",
width=2
)
)
)
# fig.show()
return fig
df_most_asyl_year = df_most_asyl.loc[df_most_asyl.Year == 2019].nlargest(10, columns='applied').sort_values(by='applied', ascending=True)
# function for barchart
def plot_barchart(df_most_asyl_year, title=''):
fig = go.Figure(go.Bar(
x=df_most_asyl_year['applied'],
y=df_most_asyl_year['Country of origin'],
text=df_most_asyl_year['Country of origin'], # setting the text for the values
textposition='auto',
insidetextanchor='end',
orientation='h',
marker=dict(color='rgb(66, 146, 198)', line=dict(color='rgb(8,48,107)', width=0.5)),
textfont=dict(size=12)
))
# Plotting another individual barplot and change it to invisible
fig.add_trace(go.Bar(
x=df_most_asyl_year['applied'],
y=df_most_asyl_year['Country of origin'],
text=df_most_asyl_year['applied'],
textposition='auto',
insidetextanchor='start',
orientation='h',
marker=dict(color='rgba(0,0,0,0)', line=dict(color='rgba(0,0,0,0)', width=1.5)), # make this plot invisible
textfont=dict(size=12)
))
fig.update_layout(
title=title,
title_x = 0.5,
xaxis=dict(
title='Number of Refugees',
showline=True,
showgrid=False,
showticklabels=True,
linecolor='rgb(204,204, 204)',
linewidth=2, ticks='outside', tickfont=dict(
family='Arial', size=12, color='rgb(82, 82, 82)'),
range=[0, 500000]
),
yaxis=dict(
title='',
showgrid=False, zeroline=False, showline=False,
showticklabels=False),
autosize=True,
showlegend=False, plot_bgcolor='white',
barmode='stack',
height=500,
#width=1200,
)
#fig.show()
return fig
Selecting the Venezuela Data¶
# select df for Venezuela
df_venez = df_asyl_grp.loc[df_asyl_grp['Country of origin'] == 'Venezuela, RB']
# group by year and country of asylum
df_venez_asylum = df_venez.groupby(by=['Year','Country of asylum (ISO)'])['applied'].sum(numeric_only=True).reset_index().sort_values(by='Year', ascending=True)
Sankey Diagram¶
def select_df_year(df: pd.DataFrame, year: int) -> pd.DataFrame:
""" Selects the data for a specific year from the DataFrame df"""
return df.loc[df.Year == year]
def get_links(df: pd.DataFrame, year: int) -> pd.DataFrame:
""" Creates a DataFrame of year with the links between the countries"""
df = select_df_year(df, year)
links = df.groupby(by=['Country of origin', 'Country of asylum']).sum(numeric_only=True).reset_index()[['Country of origin', 'Country of asylum', 'applied']]
links.columns = ['source', 'target', 'value']
return links
links = get_links(df_asyl_grp, 2015)
def processingSankeyData(df: pd.DataFrame, year,title, n_largest=50, height=800)-> go.Figure:
""" Process the data for the Sankey Diagram and plot it"""
df = get_links(df, year)
df = df.nlargest(n_largest, columns='value')
# Processing the data for the Sankey Diagram
unique_source_target = list(pd.unique(df[['source', 'target']].values.ravel('K')))
mapping_dict = {k: v for v, k in enumerate(unique_source_target)}
df['source'] = df['source'].map(mapping_dict)
df['target'] = df['target'].map(mapping_dict)
# define color palette for the plot
import seaborn as sns
colors = sns.color_palette('Blues_r', n_colors=len(unique_source_target))
# Covert the colors to rgba
rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
links_dict = df.to_dict(orient='list')
# set color for links
link_colors = [rgb_colors[src] for src in links_dict['source']]
# plotting Sankey Diagram
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 10,
thickness = 20,
line = dict(color = "white", width = 0.5),
label = unique_source_target,
color = 'rgb(66, 146, 198)',
align='left',
#font=dict(size=12, color='white'),
),
link = dict(
source = links_dict['source'],
target = links_dict['target'],
value = links_dict['value'],
label = links_dict['value'],
color = rgb_colors,
arrowlen=15,
customdata=links_dict['value'],
hovertemplate='Number of Asylum Applications: %{customdata}<extra></extra>'
))])
fig.update_layout(
title_text=title,
font_size=12,
font = dict(size=14, color='black', style='normal'),
height=height,
#plot_bgcolor='black',
paper_bgcolor='white',)
# fig.show()
return fig
# Test Sankey Diagram
processingSankeyData(df_asyl_grp, year=2019, n_largest=50, title='Sankey Diagram of the Asylum Seekers in 2019').show()
Geolineplots¶
# load iso_lat_long.csv
df_iso_code = pd.read_csv('iso_lat_long.csv')
display(df_iso_code.head(5))
| iso_code | iso_lat_long | |
|---|---|---|
| 0 | ZMB | (-14.5189121, 27.5589884) |
| 1 | CIV | (7.9897371, -5.5679458) |
| 2 | DNK | (55.670249, 10.3333283) |
| 3 | DEU | (51.1638175, 10.4478313) |
| 4 | CZE | (49.7439047, 15.3381061) |
# split the iso_lat_long column into latitude and longitude
df_iso_code[['latitude', 'longitude']] = df_iso_code['iso_lat_long'].str[1:-1].str.split(',', expand=True)
df_iso_code[['latitude', 'longitude']] = df_iso_code[['latitude', 'longitude']].astype(float)
df_iso_code.head(3)
| iso_code | iso_lat_long | latitude | longitude | |
|---|---|---|---|---|
| 0 | ZMB | (-14.5189121, 27.5589884) | -14.518912 | 27.558988 |
| 1 | CIV | (7.9897371, -5.5679458) | 7.989737 | -5.567946 |
| 2 | DNK | (55.670249, 10.3333283) | 55.670249 | 10.333328 |
# define a dictionary for the iso_code and the latitude and longitude
iso_code_dict_lat = df_iso_code.set_index('iso_code')['latitude'].to_dict()
iso_code_dict_lon = df_iso_code.set_index('iso_code')['longitude'].to_dict()
# Map the latitude and longitude data to the asylum and origin countries
df_venez.loc[:,'asylum_lat'] = df_venez.loc[:,'Country of asylum (ISO)'].map(iso_code_dict_lat);
df_venez.loc[:,'asylum_lon'] = df_venez.loc[:,'Country of asylum (ISO)'].map(iso_code_dict_lon);
df_venez.loc[:,'origin_lat'] = df_venez.loc[:,'Country of origin (ISO)'].map(iso_code_dict_lat);
df_venez.loc[:,'origin_lon'] = df_venez.loc[:,'Country of origin (ISO)'].map(iso_code_dict_lon);
df_venez.head(2)
| Year | Country of origin (ISO) | Country of asylum (ISO) | Country of asylum | Country of origin | applied | asylum_lat | asylum_lon | origin_lat | origin_lon | |
|---|---|---|---|---|---|---|---|---|---|---|
| 32199 | 2023 | VEN | HND | Honduras | Venezuela, RB | 28 | 15.257243 | -86.075514 | 8.001871 | -66.110932 |
| 32217 | 2023 | VEN | USA | United States of America | Venezuela, RB | 91592 | 39.783730 | -100.445882 | 8.001871 | -66.110932 |
import pycountry
# function to get the flag of the country
def get_flag(code):
try:
country = pycountry.countries.get(alpha_3=code)
return country.flag
except:
pass
return None
# get the flag of the asylum and origin countries
df_venez['asylum_flag'] = df_venez['Country of asylum (ISO)'].apply(get_flag)
df_venez['origin_flag'] = df_venez['Country of origin (ISO)'].apply(get_flag)
display(df_venez.head(5))
| Year | Country of origin (ISO) | Country of asylum (ISO) | Country of asylum | Country of origin | applied | asylum_lat | asylum_lon | origin_lat | origin_lon | asylum_flag | origin_flag | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 32199 | 2023 | VEN | HND | Honduras | Venezuela, RB | 28 | 15.257243 | -86.075514 | 8.001871 | -66.110932 | 🇭🇳 | 🇻🇪 |
| 32217 | 2023 | VEN | USA | United States of America | Venezuela, RB | 91592 | 39.783730 | -100.445882 | 8.001871 | -66.110932 | 🇺🇸 | 🇻🇪 |
| 32216 | 2023 | VEN | URY | Uruguay | Venezuela, RB | 504 | -32.875555 | -56.020153 | 8.001871 | -66.110932 | 🇺🇾 | 🇻🇪 |
| 32215 | 2023 | VEN | TTO | Trinidad and Tobago | Venezuela, RB | 3463 | 10.746690 | -61.084007 | 8.001871 | -66.110932 | 🇹🇹 | 🇻🇪 |
| 32214 | 2023 | VEN | SWE | Sweden | Venezuela, RB | 95 | 59.674971 | 14.520858 | 8.001871 | -66.110932 | 🇸🇪 | 🇻🇪 |
# select the data for the year 2019
df_venez_2019 = select_df_year(df_venez, 2019)
def plot_geo_lines(df, year, n_largest, start_lon_col, start_lat_col, end_lon_col, end_lat_col, title='Title', template='plotly_white', lataxis=[-60, 90],
lonaxis=[-130, 60], add_flags=False, add_names=False, show_fig=False, height=800, width=1200, y_title=0.95):
import numpy as np
import seaborn as sns
df = select_df_year(df, year)
df = df.nlargest(n_largest, columns='applied')
df_color = get_links(df, year)
unique_source_target = list(pd.unique(df_color[['source', 'target']].values.ravel('K')))
colors = sns.color_palette('Blues_r', n_colors=len(unique_source_target))
rgb_colors = ["rgba"+str((int(r*255), int(g*255), int(b*255), (1))) for r, g, b in colors]
range_list = np.arange(0, df.applied.max()+1, df.applied.max()/10)
values = [1, 3.6, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 8]
for i in range(len(values)):
df.loc[df.applied.between(range_list[i], range_list[i+1]), 'bin_value'] = values[i]
fig = go.Figure()
lons = np.empty(3 * len(df))
lons[::3] = df[start_lon_col]
lons[1::3] = df[end_lon_col]
lons[2::3] = None
lats = np.empty(3 * len(df))
lats[::3] = df[start_lat_col]
lats[1::3] = df[end_lat_col]
lats[2::3] = None
df = df.reset_index(drop=True)
color_countries = pd.concat([df['Country of asylum (ISO)'], pd.Series(['VEN'])])
colors_value = df['applied']
# Add Venezuela in Color
fig.add_trace(go.Choropleth(
locations=['VEN'],
z=[1],
colorscale=[(0, 'yellow'), (1, 'yellow')],
marker_line_width=0.8,
locationmode='ISO-3',
showscale=False,
hoverinfo='none'
))
hover_text = [f"Country: {country}<br>Number of Asylum Applications: {value}" for country, value in zip(df['Country of asylum'], df['applied'])]
# add Countries of Asylumn to the map
fig.add_trace(go.Choropleth(
locations=color_countries,
z=colors_value,
text=hover_text,
zmin=colors_value.mean() - colors_value.std()*2,
zmax=colors_value.mean() + colors_value.std(),
colorscale='Blues',
autocolorscale=False,
reversescale=False,
marker_line_width=0.8,
locationmode='ISO-3',
showscale=False,
hoverinfo='text'
))
customdata = np.stack(df['applied'], axis=-1)
for i in range(len(df)):
start_lon = df.loc[i, start_lon_col]
start_lat = df.loc[i, start_lat_col]
end_lon = df.loc[i, end_lon_col]
end_lat = df.loc[i, end_lat_col]
# Add lines with arrow
fig.add_trace(
go.Scattergeo(
lon = [start_lon, end_lon],
lat = [start_lat, end_lat],
mode = 'lines+markers',
line = dict(width = df.loc[i, 'bin_value'], color = 'red'),
marker = dict(size=10, color='red', symbol='arrow-bar-down'),
opacity = 0.5,
text=hover_text[i],
hoverinfo='text'
))
# Add flags
if add_flags:
fig.add_trace(
go.Scattergeo(
lon=[end_lon],
lat=[end_lat+2.3],
mode='markers+text',
hoverinfo='none',
text=[df.loc[i, 'asylum_flag']],
textposition='middle center',
textfont=dict(size=25),
marker=dict(size=1, color='red')
)
)
# Add names
if add_names:
country_name = df.loc[i, 'Country of asylum (ISO)']
text = f'<span style="background-color: white; color: black; padding: 4px; border-radius: 15px;">{country_name}</span>'
fig.add_trace(
go.Scattergeo(
lon=[end_lon],
lat=[end_lat-0.5],
mode='markers+text',
hoverinfo='none',
text=text,
textposition='bottom center',
textfont=dict(size=14, weight='bold', color='red'),
marker=dict(size=1, color='red'),
))
# Adding annotation at a specific lat and lon
annotation_text = "Data Source: UNHCR - The UN Refugee Agency"
x = 0.5
y = 0.01
fig.add_annotation(
x=x,
y=y,
xref='paper',
yref='paper',
text=annotation_text,
showarrow=False,
font=dict(size=12, color='black'),
align='center',
opacity=0.8
)
fig.update_layout(
title=dict(
text=title,
x=0.5,
y=y_title,
),
showlegend=False,
dragmode=False,
geo=dict(
scope='world',
projection_type='equirectangular',
showland=True,
showcountries=True,
showocean=True,
countrywidth=0.5,
oceancolor='rgba(250, 250, 255, 1)',
lataxis=dict(range=lataxis),
lonaxis=dict(range=lonaxis)
),
height=height,
#width=width,
)
if show_fig:
fig.show()
return None
return fig
from plotly.subplots import make_subplots
def geo_subplots(df_venez):
# define the figure with subplots
fig = make_subplots(rows=2, cols=1,
subplot_titles=(" ", " "),
specs=[[{"type": "scattergeo"}],
[{"type": "sankey"}],
])
fig2 = plot_geo_lines(df_venez,
year=2019,
n_largest=10,
start_lon_col='origin_lon',
start_lat_col='origin_lat',
end_lon_col='asylum_lon',
end_lat_col='asylum_lat',
title='',
template='plotly_white',
lataxis=[-70, 70],
lonaxis=[-120, 30],
add_flags=True,
add_names=True)
fig3 = processingSankeyData(df_venez, year=2019, n_largest=10, title='')
# traces of scattergeo
for i in range(len(fig2.data)):
fig.add_trace(fig2.data[i], row=1, col=1)
# traces of sankey
fig.add_trace(fig3.data[0], row=2, col=1)
#fig.update_layout(fig1.layout)
fig.update_layout(fig2.layout)
fig.update_layout(
autosize=True,
)
# Zeigen Sie die Subplot-Figur an
return fig
Story¶
The Venezuelan Refugee Crisis: The Fall of a Nation¶
Venezuela was previously regarded as one of the most prosperous countries in Latin America, with considerable oil reserves. Since Maduro assumed the presidency in 2013, the country has faced significant challenges. The once-democratic nation is currently facing significant challenges, including economic collapse and a government that is struggling to meet the needs of its people. With the highest inflation in the world, many Venezuelans are struggling to afford food and medicine. GDP has fallen to a level that is higher than that experienced in the US during the Great Depression, and the homicide rate is one of the highest in the world. These challenges have prompted a significant number of Venezuelans to express their concerns and dissatisfaction with the current government, leading to widespread protests against President Nicolás Maduro.
When oil prices fell in 2014, it would have been advisable for Maduro to adjust Venezuela's economy. The rise in inflation has made essential items unaffordable for many in the lower income brackets. It seems that Maduro may have been attempting to manipulate the economy for political gain. It has been reported that he set an official exchange rate of 10 bolivars to the US dollar for his allies, while the black market rate was around 12,000 bolivars to the dollar. This unfortunately served to further exacerbate the situation.
In 2016, Maduro made the decision to place the military in charge of the food supply, which allowed them to profit by importing food at a reduced cost and selling it on the black market. This corruption helped him stay in power with military and political support. As a result, many Venezuelans chose to leave the country to escape violence, hunger and high inflation, seeking safety and stability in other countries. It was at this time, and long before, that the collapse of a nation began and many Venezuelans began to seek refuge around the world, as shown in Figure 1.
plot_geo_lines(df_venez,year=2019,n_largest=30, start_lon_col='origin_lon', start_lat_col='origin_lat',
end_lon_col='asylum_lon', end_lat_col='asylum_lat', title='(Figure 1) - 2019: Venezuela Refugee Movement',
template='plotly_white',lataxis=[-90, 90],lonaxis=[-180, 190],
add_flags=True, add_names=False, show_fig=False, height=800, y_title=0.9).show()
Figure 1 offers an insight into the scale of efforts made by Venezuelans in 2019, and the destinations to which they sought refuge. The majority sought refuge in neighbouring South American countries, but it is notable that a significant number also fled to Europe, the US, Canada and Australia. This illustrates the global reach of the Venezuelan refugee crisis.
As the situation in Venezuela deteriorated and poverty and violence intensified, the country faced a significant challenge with regards to internal displacement. This is the largest such crisis in the history of Latin America.
line_plot(df_most_asyl, dataframes, title='(Figure 2) - Tracking Asylum Applications by Country: 2015-2023').show()
In comparing the number of asylum applications, it becomes evident that Venezuela stands out dramatically in 2019. Figure 1 illustrates that while the number of asylum seekers from Syria, Afghanistan and Ukraine has decreased, the number of Venezuelan refugees has increased significantly from the beginning of the crisis in 2016 to 2019. By 2019, more than 440,000 Venezuelans had applied for asylum, although this number saw a decline as the global spread of the Covid-19 pandemic, led to a challenging environment for many.
Figure 3 illustrates that the number of applications from Venezuela reached over 440,000 in 2019. This represents a significant increase compared to the number of refugees from Afghanistan and Syria combined.
plot_barchart(df_most_asyl_year, title='(Figure 3) - 2019: Ranking the Top 10 Countries by Number of Asylum Applications').show()
Where did the Venezuelans go in 2019?¶
As illustrated in Figure 4, the majority of Venezuelan refugees have sought asylum in neighbouring countries such as Colombia, Peru and Brazil. Some opted to apply for asylum in countries further afield, including the United States and Spain. Despite the challenges, many Venezuelans continue to seek better living conditions and safety elsewhere. The majority of Venezuelan refugees have found safety in neighbouring countries such as Peru, Brazil and Colombia. It would appear that Peru is currently the country that has taken the greatest number of refugees, with nearly 260,000, while Brazil has taken nearly 50,000.
It is also worth noting that a significant number of Venezuelans have sought refuge in Europe, with Spain being a notable destination, having hosted 41,000 individuals. Additionally, 35,600 individuals sought refuge in the United States, where they were able to pursue legal avenues for their stay and contribute to the economy. Despite the difficulties they face, many Venezuelan refugees are striving to rebuild their lives and become part of their host communities.
processingSankeyData(df_venez, year=2019, n_largest=10, title='(Figure 4) - Major Destinations for Venezuelan Refugees: Top 10 Countries', height=370).show()
plot_geo_lines(df_venez,year=2019,n_largest=10, start_lon_col='origin_lon', start_lat_col='origin_lat', end_lon_col='asylum_lon', end_lat_col='asylum_lat',
title='(Figure 5) - 2019: Venezuelas Refugee Movement: Top 10 Countries', template='plotly_white',lataxis=[-60, 60],lonaxis=[-120, 30],
add_flags=True,add_names=True,show_fig=False, height=1000, y_title=0.92).show()
The UN Refugee Agency (UNHCR), in partnership with governments, partner organisations, civil society, and other UN agencies, is working diligently to protect Venezuelan refugees and migrants. They provide assistance in border areas, legal aid and counselling, while also promoting socioeconomic inclusion.
UNHCR works in close collaboration with local authorities, civil society, and the private sector with the aim of integrating refugees into host communities. They also provide support for vocational training and relocation to areas with better employment opportunities and services. It is estimated that seventeen countries in Latin America and the Caribbean host around 80% of Venezuelan refugees, which has resulted in the largest external displacement crisis in the region's history. It is estimated that thousands of people have crossed South America on foot, with many not knowing their final destination. Some have been reunited with loved ones, while others have left behind families and communities.
Those seeking refuge and migrants use a variety of routes to reach safety, including land, sea, and air. Many are taking maritime routes to neighbouring Caribbean islands, a trend that has increased in recent years. Many travel without documents, which can put them at risk from smugglers and traffickers. Despite these challenges, countries in the region have opened their borders, providing Venezuelans with access to healthcare, education, and employment. This is a positive step towards offering them a chance at a better life amidst the ongoing crisis.
Sources:
(1): https://www.youtube.com/watch?v=S1gUR8wM5vA&t=336s
(2): https://www.unrefugees.org/news/venezuela-crisis-explained/
(3): https://www.unhcr.org/emergencies/venezuela-situation
(4): https://www.iom.int/venezuelan-refugee-and-migrant-crisis